package com.hr.mes.utils;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.io.Encoders;
import io.jsonwebtoken.security.Keys;

import java.util.Date;

/**
 * JWT：json web token
 */
public class JWTUtil {

    /**
     * 如果这样写30*24*60*60*1000，会按int类型计算，会溢出，变成负
     */
    private static final long EXPIRATION_TIME=30L*24*60*60*1000;

    private static final String SECRET_KEY=Encoders.BASE64.encode(Keys.secretKeyFor(SignatureAlgorithm.HS256).getEncoded());

    /**
     * 生成token
     * @param username
     * @return
     */
    public static String generate(String username){
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis()+EXPIRATION_TIME))
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    /**
     * 校验token是否可解析，是否过期
     * @param token
     * @return
     */
    public static boolean verify(String token){
        try {
            Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
            return true;
        }catch (Exception e){
            return false;
        }
    }

    /**
     * 判断token是否已经过期，这似乎不必要，Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token)也会判断token是否过期
     * @param token
     * @return
     */
    @Deprecated
    public static boolean isExpired(String token){
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody()
                .getExpiration()
                .before(new Date());
    }

    /**
     * 从token中获取用户名
     * @param token
     * @return
     */
    public static String getUsername(String token){
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }

}
